/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ravennet.manager;

import com.ravennet.dataobject.PartidaDataObject;
import com.ravennet.dataobject.SistemaDataObject;
import com.ravennet.utils.RavennetHashMap;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author Rav
 */
public class PartidaManager {

    private static final String archivoPartidas = "d:/partidas.dat";
    
    private RavennetHashMap<String,PartidaDataObject> mapaPartidas;
    private SistemaDataObject sistemaDO;
    public PartidaManager(){
        leerDatos();
        
    }
    
    private void leerDatos(){
        try {
            File file = new File(archivoPartidas);
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);
            sistemaDO = (SistemaDataObject)ois.readObject();
            mapaPartidas = sistemaDO.getMapaPartidas();
            ois.close();
            fis.close();
        } catch (Exception ex) {
            Logger.getLogger(PartidaManager.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("error al leer el archivo de partidas");
            sistemaDO = new SistemaDataObject();
            mapaPartidas= sistemaDO.getMapaPartidas();
            ex.printStackTrace();
        }
    }
    
    public ArrayList<String> getListaPartidas(){
        this.leerDatos();
        if(mapaPartidas!=null){
            return new ArrayList<String>(mapaPartidas.keySet());
        }
        return new ArrayList<String>();
    }
    
    public ArrayList<String> getListaPartidas(String usuario){
        this.leerDatos();
        ArrayList<String> lista = new ArrayList<String>();
        while(mapaPartidas.hasNext()){
            PartidaDataObject partida = (mapaPartidas.next());
            if(partida.getJugador(usuario)!=null){
                lista.add(partida.getId());
            }
        }
        return lista;
    }
    
    public PartidaDataObject getPartida(String key){
        this.leerDatos();
        return (PartidaDataObject)mapaPartidas.get(key);
    }
    
    public String guardarNueva(PartidaDataObject partida){
        String key = ""+this.getListaPartidas().size();
        partida.setId(key);
        mapaPartidas.put(key, partida);
        this.guardarTodo();
        return key;
        
    }
    
    public void guardarTodo(){
        try {
            File file = new File(archivoPartidas);
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            sistemaDO.setMapaPartidas(mapaPartidas);
            oos.writeObject(sistemaDO);
            oos.flush();
            oos.close();
            fos.close();
        } catch (Exception ex) {
            Logger.getLogger(PartidaManager.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("error al guardar el archivo de partidas");
            ex.printStackTrace();
        }    
    }
    
    public boolean validarUsuario(String nombre, String password){
        return sistemaDO.validarUsuario(nombre, password);
        
    }
    
    public void registrarUsuario(String nombre, String password) throws Exception{
        sistemaDO.registrarUsuario(nombre, password);
        this.guardarTodo();
    }
    
    public HashMap<String, PartidaDataObject> getMapaPartidas() {
        return mapaPartidas;
    }

    public void setMapaPartidas(RavennetHashMap<String, PartidaDataObject> mapaPartidas) {
        this.mapaPartidas = mapaPartidas;
    }
    
    public static void main(String args[]){
        
        PartidaManager m = new PartidaManager();
        System.out.println(m.getListaPartidas());
    }
}
